﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades;
using System.Data;
namespace AccesoBD
{
    public class Empleados
    {
        public static bool registrarEmpleado(Empleado oE, Domicilio oD)
        {

            bool resultado = false;
            int resultadoConsulta;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = null;
            tran = con.BeginTransaction();
            try
            {
                string comando = "insert into Persona (nombre,apellido,tipoDocumento,nroDocumento,telefono,celular,mail,sexo,fechaNacimiento) values(@nombre,@apellido,@tipoDocumento,@nroDocumento,@telefono,@celular,@mail,@sexo,@fechaNacimiento)  ";
                List<SqlParameter> listp = new List<SqlParameter>();
                
              
                listp.Add(new SqlParameter("@nombre", oE.Nombre));
                listp.Add(new SqlParameter("@apellido", oE.Apellido));
                listp.Add(new SqlParameter("@tipoDocumento", oE.CodTipoDoc));
                listp.Add(new SqlParameter("@nroDocumento", oE.NroDocumento));
                listp.Add(new SqlParameter("@fechaNacimiento", oE.FechaNacimiento));
                listp.Add(new SqlParameter("@sexo", oE.CodSexo));

                //PARAMETROS QUE PUEDEN RECIBIR NULL

                if (oE.Telefono == null)
                {
                    listp.Add(new SqlParameter("@telefono", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@telefono", oE.Telefono));
                }

                if (oE.Celular == null)
                {
                    listp.Add(new SqlParameter("@celular", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@celular", oE.Celular));
                }
                if (oE.Mail == null)
                {
                    listp.Add(new SqlParameter("@mail", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@mail", oE.Mail));
                }

              

                resultadoConsulta = DB.EjecutarCommand(comando, listp, con, tran);

                if (resultadoConsulta > 0)
                {

                    //REGISTRAMOS DOMICILIO
                    comando = "insert into Domicilio (calle, numero, idBarrio, piso, departamento,codigoPostal) values(@calle, @numero, @idBarrio,@piso,@departamento,@codigoPostal)";
                    listp = null;
                    listp = new List<SqlParameter>();
                    
                    listp.Add(new SqlParameter("@calle", oD.calle));
                    listp.Add(new SqlParameter("@numero", oD.numero));
                    listp.Add(new SqlParameter("@idBarrio", oD.idBarrio));
                    if (oD.piso == null)
                    {
                        listp.Add(new SqlParameter("@Piso", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@Piso", oD.piso));
                    }
                    if (oD.Departamento == null)
                    {
                        listp.Add(new SqlParameter("@departamento", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@departamento", oD.Departamento));

                    }
                    if (oD.codPostal == null)
                    {
                        listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@codigoPostal", oD.codPostal));

                    }
                    resultadoConsulta = DB.EjecutarCommand(comando, listp, con, tran);
                    //REGISTRAR EMPLEADO
                    if (resultadoConsulta > 0)
                    {
                        oE.idDomicilio = Domicilios.ObtenerUltimoIDDomicilio(tran, con);
                        oE.codPersona = ObtenerUltimoIDPersona(tran,con);
                        comando = "insert into Empleado(legajoEmpleado,idPersona,idCargo,idDomicilio,fechaAlta,foto)values(@legajoEmpleado,@idPersona,@idCargo,@idDomicilio,@fechaAlta,@foto)";
                        listp = null;
                        listp = new List<SqlParameter>();
                        listp.Add(new SqlParameter("@idDomicilio", oE.idDomicilio));
                        listp.Add(new SqlParameter("@idPersona", oE.codPersona));
                        listp.Add(new SqlParameter("@legajoEmpleado", oE.Legajo));
                        listp.Add(new SqlParameter("@idCargo", oE.idCargo));
                        listp.Add(new SqlParameter("@fechaAlta", oE.fechaAlta));
                        if (oE.foto == null)
                        {
                            listp.Add(new SqlParameter("@foto", DBNull.Value));
                        }
                        else
                        {

                            // Asignando el valor de la imagen
                            // Stream usado como buffer
                            System.IO.MemoryStream ms = new System.IO.MemoryStream();
                            // Se guarda la imagen en el buffer
                            oE.foto.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                            // Se extraen los bytes del buffer para asignarlos como valor para el parámetro.
                            listp.Add(new SqlParameter("@foto", ms.GetBuffer()));
                        }
                        resultadoConsulta = DB.EjecutarCommand(comando, listp, con, tran);
                        if (resultadoConsulta > 0)
                        {
                            tran.Commit();
                            resultado = true;

                        }


                    }
                }

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }

                throw new Exception("Error al registrar un nuevo empleado" + Ex.Message);
            }
            finally
            {
                con.Close();

            }

            return resultado;

        }

        public static bool verificarExistenciaEmpleado(long numdoc)
        {
            bool res = false;
            SqlConnection con = DB.Conectar();

            try
            {
                string comando = "select * from Empleado E,Persona P where E.idPersona=P.codPersona and P.nroDocumento=@numdoc";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@numdoc", numdoc));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    res = true;
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al buscar el empleado: " + Ex.Message);
            }
            finally
            {
                con.Close();

            }
            return res;

        }
        public static long ObtenerUltimoIDPersona(SqlTransaction tran, SqlConnection con)
        {
            long id = 0;

            try
            {
                string comando = "select Max(codPersona) from Persona";
                List<SqlParameter> listp = new List<SqlParameter>();
                id = long.Parse(DB.EjecutarScalar(comando, listp, con, tran));
                if (id > 0)
                {
                    return id;
                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener ultimo Id de la Persona " + Ex.Message);
            }

            return id;
        }
        public static long obtenerUltimoIdEmpleado()
        {
            long legajoEmp = 0;
            SqlConnection con = DB.Conectar();
            SqlTransaction tran = null;
            tran = con.BeginTransaction();
            try
            {
                string comando = "select Max(legajoEmpleado) from Empleado";
                List<SqlParameter> listp = new List<SqlParameter>();
                string legajo = DB.EjecutarScalar(comando, listp, con, tran);
                if (!string.IsNullOrEmpty(legajo))
                {
                    tran.Commit();
                    legajoEmp = long.Parse(legajo.ToString());
                }
            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al obtener ultimo legajo Empleado: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return legajoEmp;
        }
        public static long obtenerUltimoIdEmpleado(SqlConnection con, SqlTransaction tran)
        {
            long legajoEmp = 0;

            try
            {
                string comando = "select Max(legajoEmpleado) from Empleado";
                List<SqlParameter> listp = new List<SqlParameter>();
                string legajo = DB.EjecutarScalar(comando, listp, con, tran);
                if (!string.IsNullOrEmpty(legajo))
                {

                    legajoEmp = long.Parse(legajo.ToString());
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener ultimo legajo Empleado: " + Ex.Message);
            }
            finally
            {

            }
            return legajoEmp;
        }
        public static List<Empleado> obtenerTodosActivos()
        {
            List<Empleado> listE = new List<Empleado>();
            Empleado oE = null;
            SqlConnection con = DB.Conectar();

            try
            {
                string comando = "select * from Empleado E, Persona P where E.idPersona=P.codPersona and E.fechaBaja is Null ";
                List<SqlParameter> listp = new List<SqlParameter>();

                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                while (dr.Read())
                {
                    oE = new Empleado();
                    oE.Nombre = dr["nombre"].ToString();
                    oE.Apellido = dr["apellido"].ToString();
                    oE.NombreYApellido = dr["nombre"].ToString()+", " + dr["apellido"].ToString(); 
                    oE.Legajo = long.Parse(dr["legajoEmpleado"].ToString());
                    oE.CodTipoDoc = int.Parse(dr["tipoDocumento"].ToString());
                    oE.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    oE.CodSexo = int.Parse(dr["sexo"].ToString());
                    oE.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["telefono"] != DBNull.Value)
                    {
                        oE.Telefono = long.Parse(dr["telefono"].ToString());
                    }
                    if (dr["fechaNacimiento"] != DBNull.Value)
                    {
                        oE.FechaNacimiento = DateTime.Parse(dr["fechaNacimiento"].ToString());
                    }
                    if (dr["celular"] != DBNull.Value)
                    {
                        oE.Celular = long.Parse(dr["celular"].ToString());
                    }
                    if (dr["mail"] != DBNull.Value)
                    {
                        oE.Mail = dr["mail"].ToString();
                    }
                    //OBTENEMOS EL CARGO
                    oE.idCargo = int.Parse(dr["idCargo"].ToString());
                    //OBTENEMOS EL DOMICILIO
                    if (dr["idDomicilio"] == DBNull.Value)
                        oE.idDomicilio = 0;
                    else
                        oE.idDomicilio = long.Parse(dr["idDomicilio"].ToString());
                    listE.Add(oE);
                    oE = null;

                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener los empleados:" + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return listE;



        }
        public static List<Empleado> obtenerEmpleado(long? legajo, long? numDoc, string apellido)
        {
            List<Empleado> lstEmpleado = new List<Empleado>();
            Empleado oE = null;
            SqlConnection con = DB.Conectar();

            try
            {

                string comando = "select * from Empleado E, Persona P where E.idPersona=P.codPersona ";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = null;
                if (legajo != null && numDoc != null && apellido != "")
                {

                    comando += "and E.legajoEmpleado=@legajo and P.apellido like '%" + apellido + "%' and P.nroDocumento=@numDoc ";
                    listp.Add(new SqlParameter("@legajo", legajo));
                    listp.Add(new SqlParameter("@apellido", apellido));
                    listp.Add(new SqlParameter("@numDoc", numDoc));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else if (apellido != "")
                {
                    comando += "and P.apellido like '%" + apellido + "%'";
                    listp = new List<SqlParameter>();

                    listp.Add(new SqlParameter("@apellido", apellido));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else if (numDoc != null)
                {
                    listp = new List<SqlParameter>();
                    comando += " and P.nroDocumento=@numDoc ";

                    listp.Add(new SqlParameter("@numDoc", numDoc));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else if (legajo != null)
                {
                    listp = new List<SqlParameter>();
                    comando += "and E.legajoEmpleado=@legajo";
                    listp.Add(new SqlParameter("@legajo", legajo));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else

                    dr = DB.GenerarReader(comando, listp, con);


                while (dr.Read())
                {
                    oE = new Empleado();
                    oE.codPersona = (long)dr["idPersona"];
                    oE.Nombre = dr["Nombre"].ToString();
                    oE.Apellido = dr["Apellido"].ToString();
                    oE.Legajo = long.Parse(dr["legajoEmpleado"].ToString());
                    oE.CodTipoDoc = int.Parse(dr["tipoDocumento"].ToString());
                    oE.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    oE.CodSexo = int.Parse(dr["sexo"].ToString());
                    oE.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        oE.fechaBaja = DateTime.Parse(dr["fechaBaja"].ToString());
                    }

                    if (dr["telefono"] != DBNull.Value)
                    {
                        oE.Telefono = long.Parse(dr["telefono"].ToString());
                    }


                    if (dr["fechaNacimiento"] != DBNull.Value)
                    {
                        oE.FechaNacimiento = DateTime.Parse(dr["fechaNacimiento"].ToString());
                    }

                    if (dr["celular"] != DBNull.Value)
                    {
                        oE.Celular = long.Parse(dr["celular"].ToString());
                    }
                    if (dr["mail"] != DBNull.Value)
                    {
                        oE.Mail = dr["mail"].ToString();
                    }
                    //OBTENEMOS EL CARGO
                    oE.idCargo = int.Parse(dr["idCargo"].ToString());
                    //OBTENEMOS EL DOMICILIO
                    oE.idDomicilio = long.Parse(dr["idDomicilio"].ToString());
                    lstEmpleado.Add(oE);
                    oE = null;

                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener los empleados:" + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return lstEmpleado;

        }
        public static Empleado obtenerEmpleadoPorLegajo(long legajo)
        {

            Empleado oE = null;
            SqlConnection con = DB.Conectar();

            try
            {

                string comando = "select * from Empleado E, Persona P where E.idPersona=P.codPersona and E.legajoEmpleado=@legajo";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = null;

                listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@legajo", legajo));
                dr = DB.GenerarReader(comando, listp, con);

                if (dr.Read())
                {
                    oE = new Empleado();
                    oE.codPersona = (long)dr["idPersona"];
                    oE.Nombre = dr["Nombre"].ToString();
                    oE.Apellido = dr["Apellido"].ToString();
                    oE.Legajo = long.Parse(dr["legajoEmpleado"].ToString());
                    oE.CodTipoDoc = int.Parse(dr["tipoDocumento"].ToString());
                    oE.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    oE.CodSexo = int.Parse(dr["sexo"].ToString());
                    oE.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        oE.fechaBaja = DateTime.Parse(dr["fechaBaja"].ToString());
                    }

                    if (dr["telefono"] != DBNull.Value)
                    {
                        oE.Telefono = long.Parse(dr["telefono"].ToString());
                    }


                    if (dr["fechaNacimiento"] != DBNull.Value)
                    {
                        oE.FechaNacimiento = DateTime.Parse(dr["fechaNacimiento"].ToString());
                    }

                    if (dr["celular"] != DBNull.Value)
                    {
                        oE.Celular = long.Parse(dr["celular"].ToString());
                    }
                    if (dr["mail"] != DBNull.Value)
                    {
                        oE.Mail = dr["mail"].ToString();
                    }
                    //OBTENEMOS EL CARGO
                    oE.idCargo = int.Parse(dr["idCargo"].ToString());
                    //OBTENEMOS EL DOMICILIO
                    //oE.idDomicilio = long.Parse(dr["idDomicilio"].ToString());


                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener los empleados:" + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return oE;

        }
        public static bool modificarEmpleado(Empleado oE)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar(); ;
            SqlTransaction tran = null;
            tran = con.BeginTransaction();

            try
            {
                //MODIFICAR DATOS PERSONA------------------
                string comando = "update  Persona  set nombre=@nombre, apellido=@apellido, tipoDocumento=@tipoDocumento, nroDocumento=@nroDocumento, telefono=@telefono, celular=@celular,mail=@mail,sexo=@sexo,fechaNacimiento=@fechaNacimiento where codPersona=@codPersona";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@codPersona", oE.codPersona));
                listp.Add(new SqlParameter("@nombre", oE.Nombre));
                listp.Add(new SqlParameter("@apellido", oE.Apellido));
                listp.Add(new SqlParameter("@tipoDocumento", oE.CodTipoDoc));
                listp.Add(new SqlParameter("@nroDocumento", oE.NroDocumento));
                listp.Add(new SqlParameter("@fechaNacimiento", oE.FechaNacimiento));
                listp.Add(new SqlParameter("@sexo", oE.CodSexo));
                if (oE.Telefono == null)
                {
                    listp.Add(new SqlParameter("@telefono", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@telefono", oE.Telefono));
                }

                if (oE.Celular == null)
                {
                    listp.Add(new SqlParameter("@celular", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@celular", oE.Celular));
                }
                if (oE.Mail == null)
                {
                    listp.Add(new SqlParameter("@mail", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@mail", oE.Mail));
                }
                int res = DB.EjecutarCommand(comando, listp, con, tran);

                //MODIFICAR DOMICILIO----------------------------
                if (res > 0)
                {
                    comando = "update Domicilio set calle=@calle, numero=@numero, piso=@piso, departamento=@departamento, codigoPostal=@codigoPostal, idBarrio=@idBarrio where idDomicilio=@idDomicilio";
                    listp = null;
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@idDomicilio", oE.domicilio.idDomicilio));
                    listp.Add(new SqlParameter("@calle", oE.domicilio.calle));
                    listp.Add(new SqlParameter("@numero", oE.domicilio.numero));
                    listp.Add(new SqlParameter("@idBarrio", oE.domicilio.idBarrio));

                    if (oE.domicilio.piso != null)
                    {
                        listp.Add(new SqlParameter("@piso", oE.domicilio.piso));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@piso", DBNull.Value));
                    }

                    if (oE.domicilio.Departamento != null)
                    {
                        listp.Add(new SqlParameter("@departamento", oE.domicilio.Departamento));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@departamento", DBNull.Value));
                    }

                    if (oE.domicilio.codPostal != null)
                    {
                        listp.Add(new SqlParameter("@codigoPostal", oE.domicilio.codPostal));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                    }

                    res = DB.EjecutarCommand(comando, listp, con, tran);
                    //MODIFICAR CARGO-------------------------------
                    if (res > 0)
                    {
                        comando = "update Empleado set idCargo=@idCargo where legajoEmpleado=@legajo";
                        listp = null;
                        listp = new List<SqlParameter>();
                        listp.Add(new SqlParameter("@legajo", oE.Legajo));
                        listp.Add(new SqlParameter("@idCargo", oE.cargo.idCargo));
                        res = DB.EjecutarCommand(comando, listp, con, tran);
                        if (res > 0)
                        {
                            tran.Commit();
                            resultado = true;
                        }
                    }


                }
            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al modificar empleado:" + Ex.Message);
            }
            return resultado;
        }
        public static bool registrarBajaEmpleado(Empleado oE)
        {
            bool resultado = false;
            SqlConnection con = DB.Conectar(); ;
            SqlTransaction tran = null;
            tran = con.BeginTransaction();
            try
            {
                string comando = "update Empleado set fechaBaja=@fechaBaja where legajoEmpleado=@legajo ";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@legajo", oE.Legajo));
                listp.Add(new SqlParameter("@fechaBaja", oE.fechaBaja));
                int res = DB.EjecutarCommand(comando, listp, con, tran);
                if (res > 0)
                {
                    tran.Commit();
                    resultado = true;
                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Erro al registrar la baja: " + Ex.Message);
            }
            finally
            {
                con.Close();
            }
            return resultado;
        }

        public static Empleado ObtenerEmpleadoPorUsuario(int idUsuario)
        {
            Empleado emp = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Empleado.legajoEmpleado, Empleado.idUsuario, Persona.nombre, Persona.codPersona, Persona.apellido, Persona.tipoDocumento, Persona.nroDocumento "
                            + "FROM Empleado INNER JOIN Persona ON Empleado.idPersona = Persona.codPersona "
                            + "WHERE (Empleado.idUsuario = @idUsuario)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idUsuario", idUsuario));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    emp = new Empleado();
                    while (dr.Read())
                    {
                        emp.Legajo = long.Parse(dr["legajoEmpleado"].ToString());
                        emp.Nombre = dr["nombre"].ToString();
                        emp.Apellido = dr["apellido"].ToString();
                        emp.codPersona = long.Parse(dr["codPersona"].ToString());
                        emp.idUsuario = int.Parse(dr["idUsuario"].ToString());
                        emp.CodTipoDoc = int.Parse(dr["tipoDocumento"].ToString());
                        emp.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    }
                    dr.Close();
                }
            }
            catch (Exception ex)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return emp;
        }

        public bool nroDocExistente(int tipoDoc, long nroDoc)
        {
            bool res = false;
            SqlConnection con = DB.Conectar();

            try
            {
                string comando = "SELECT * FROM Persona WHERE tipoDocumento=@tipoDoc AND nroDocumento=@nroDoc";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nroDoc", nroDoc));
                listp.Add(new SqlParameter("@tipoDoc", tipoDoc));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    res = true;
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al registrar el empleado: " + Ex.Message);
            }
            finally
            {
                con.Close();

            }
            return res;

        }


    }
}
